package com.java.jvm.memory;

class Outer{
    //实例内部类对象,默认会保存外部类引用
    class Inner extends Thread{
        @Override
        public void run() {//this
            System.out.println(this);//内部类对象引用
            System.out.println(Outer.this);//外部类对象应用
            while(true){}
        }
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Outer.finalize()");
    }
}

class StaticOuter{//优化
    //静态内部类,不会保存对外部类的引用,即便是此对象一直在运行,外部类也可以被销毁.
    static class StaticInner extends Thread{
        @Override
        public void run() {
            //System.out.println(Outer.this);//这样是错的
            while(true){}
        }
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("StaticOuter.finalize()");
    }
}

public class OuterInnerTests {
    static void doInstanceInner(){
        Outer outer=new Outer();
        Outer.Inner inner=outer.new Inner();//内部类对象依赖于外部类对象实例
        //Outer.Inner inner2=new Outer().new Inner();
        inner.start();
        outer=null;
        //outer置为null后,后面就访问不到Outer对象,但是这个对象不会销毁,因为Inner对象一直在运行
        System.gc();
    }
    static void doStaticInner(){
        StaticOuter outer=new StaticOuter();
        StaticOuter.StaticInner inner=new StaticOuter.StaticInner();
        inner.start();
        outer=null;
        //这里的outer置为null后,StaticOuter对象是可以销毁的
        System.gc();
    }
    public static void main(String[] args) {
        //doInstanceInner();
        doStaticInner();
    }
}


